package ru.xeden.web.html.module;

import java.util.List;

import ru.xeden.web.html.component.IComponentFactory;
import ru.xeden.web.html.layout.ILayout;
import ru.xeden.web.html.layout.ILayoutFactory;
import ru.xeden.web.html.page.IPage;
import ru.xeden.web.html.page.IPageFactory;
import ru.xeden.web.request.IRequest;


/**
 * Модуль приложения
 * @author evga
 */
public interface IModule
    extends IComponentFactory
{
    
    /**
     * @return ID модуля
     */
    String getId();

    String getDisplayName();

    /**
     * Кусок URL Который соответствует модулю
     * @return
     */
    String getUrlPiece();

    /**
     * URL до модуля
     * @return
     */
    String getUrl();

    /**
     * @return порядок отображения
     */
    int getDisplayOrder();

    /**
     * Регистрирует дочерний модуль
     * @param module
     */
    boolean registrSubModule(IModule module);

    /**
     * Удаляет с регистрации дочерний модуль
     * @param module
     */
    boolean unregistrSubModule(IModule module);

    /**
     * Возвращает список прямых подмодулей
     * @return
     */
    List<IModule> getSubModules();
    
    /**
     * Устанавливает родительский модуль
     * @param parentModule
     */
    void setParentModule(IModule parentModule);
    
    /**
     * Возвращает родительский модуль
     * @return
     */
    IModule getParentModule();

    /**
     * Устанавливает фабрику пейджов
     * @param pageFactory
     */
    void setPageFactory(IPageFactory pageFactory);

    /**
     * устанавливает фабрику компонентов
     * @param componentFactory
     */
    void setComponentFactory(IComponentFactory componentFactory);

    /**
     * Устанавливает фабрику лайоутов
     * @param layoutFactory
     */
    void setLayoutFactory(ILayoutFactory layoutFactory);

    /**
     * Создает лайоут по ID
     * @param id
     * @param leafModule конечный модуль, который запросил создание лайоута. 
     * Этот модуль обычно предоставляет фабрики компонентов при создании лайоута 
     * @return
     */
    ILayout createLayout(String id, IModule leafModule);
    
    /**
     * Возвращает пейдж для указанного запроса
     * @param request
     * @param pieces
     * @return
     */
    IPage getPage(IRequest request, UrlPieces pieces);
    
    void dispose();
}
